#include <func.h>

#define MAXLINE 1024 // 最大输入长度
#define MAXARGS 64   // 最大参数数量

// 解析命令行输入，分离命令和参数
void parseInput(char* input, char* args[]) {
    int i = 0;
    args[i] = strtok(input, " \n");
    while (args[i] != NULL) {
        i++;
        args[i] = strtok(NULL, " \n");
    }
}

void print_wstatus(int status) {
    if (WIFEXITED(status)) {
        int exit_code = WEXITSTATUS(status);
        printf("exit code: %d\n", exit_code);
    } else if (WIFSIGNALED(status)) {
        int signo = WTERMSIG(status);
        printf("signo: %d", signo);
#ifdef WCOREDUMP 
        if (WCOREDUMP(status)) {
            printf(" (core dump)");
        }
#endif
        printf("\n");
    }
}

int main() {
    char input[MAXLINE]; // 存储输入的命令行
    char* args[MAXARGS]; // 存储命令行参数

    for(;;) {
        printf("myshell> "); // 提示符
        fgets(input, MAXLINE, stdin); // 从stdin读取命令

        if (strcmp(input, "exit\n") == 0) { // 检查是否为exit命令
            break; // 退出循环
        }

        parseInput(input, args); // 解析输入的命令

        switch (fork()) {
        case -1:
            error(1, errno, "fork");
        case 0:
            // 子进程执行命令
            if (execvp(args[0], args) == -1) { 
                error(1, errno, "execvp");
            }
        default:
            // 父进程等待子进程结束
            int wstatus;
            pid_t pid = wait(&wstatus);
            printf("\n%d terminated. ", pid);
            print_wstatus(wstatus);
        }
    }

    return 0;
}
